package com.jlf.core.annotation.restful.controller;

import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.lang.annotation.*;

/**
 * 接口控制器
 *
 * @author wujr
 * 2021/1/6
 * @version 1.0
 * 变更历史
 * [wujr 2021/1/6 1.0 新增]
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RestController
@RequestMapping
public @interface RestfulController {
    @AliasFor(annotation = RestController.class, value = "value")
    String component() default "";

    @AliasFor(annotation = RequestMapping.class)
    String[] value() default {};

    @AliasFor(annotation = RequestMapping.class)
    String name() default "";

    @AliasFor(annotation = RequestMapping.class)
    String[] path() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] params() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] headers() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] consumes() default {};

    @AliasFor(annotation = RequestMapping.class)
    String[] produces() default {};

    /**
     * 是否合并当前微服务对应的应用编码
     * @return true表示在扫描接口时，需要在接口编码前加上微服务对应的应用编码
     */
    boolean mergeApp() default true;

    /**
     * 该接口控制器的领域类
     * @return 领域类
     */
    Class<?> domainClass() default Object.class;

    /**
     * 是否忽略接口的扫描
     * @return true表示忽略该控制器下的所有接口的扫描
     */
    boolean ignoreScan() default false;

    /**
     * 是否自定义结果封装
     * 默认：false，表示由框架负责进行结果的统一封装
     * 一旦变更为true，需要接口完全的自定义结果返回，包括参数的有效性校验
     * @return true表示自定义结果封装
     */
    boolean outputWrapper() default false;
}
